<?php
//   +----------------------------------------------------------------------
//   | Copyright (c) 2015-2025 http://www.hdphp.cn All rights reserved.
//   | Licensed ( http://www.hdphp.cn/licenses/ )
//   | Author: Jack <sophia2152@qq.com>
//   | 官方网址: http://www.hdphp.cn
//   | 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用。
//   | 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
//   +----------------------------------------------------------------------
namespace app\common\services\other;

use app\common\dao\other\CacheDao;
use app\common\services\BaseServices;

/**
 * Class：CacheServices
 * 创建人：Jack
 * 创建时间：2024/1/13 8:39
 * @package app\services\other
 * @mixin CacheDao
 */
class CacheServices extends BaseServices
{
    /**
     * 构造函数
     * @param CacheDao $dao
     */
    public function __construct(CacheDao $dao)
    {
        $this->dao = $dao;
    }

    /**
     * 注释：获取数据缓存
     * 创建人：Jack
     * 创建时间：2024/1/13 8:48
     * @param string                    $key
     * @param string|callable|int|array $default 默认值不存在则写入
     * @param int                       $expire
     * @return mixed|null
     */
    public function getDbCache(string $key, $default, int $expire = 0)
    {
        // 清除过期缓存
        $this->dao->delectDeOverdueDbCache();
        $result = $this->dao->value(['key' => $key], 'result');
        if ($result) {
            return json_decode($result, true);
        } else {
            if ($default instanceof \Closure) {
                // 获取缓存数据
                $value = $default();
                if ($value) {
                    $this->setDbCache($key, $value, $expire);
                    return $value;
                }
            } else {
                $this->setDbCache($key, $default, $expire);
                return $default;
            }
            return null;
        }

    }

    /**
     * 注释：设置数据缓存存在则更新，没有则写入
     * 创建人：Jack
     * 创建时间：2024/1/13 8:49
     * @param string $key
     * @param        $result
     * @param        $expire
     * @return mixed
     */
    public function setDbCache(string $key, $result, $expire = 0)
    {
        // 清除过期缓存
        $this->dao->delectDeOverdueDbCache();
        $addTime = $expire ? time() + $expire : 0;
        if ($this->dao->count(['key' => $key])) {
            return $this->dao->update($key, [
                'result' => json_encode($result),
                'expire_time' => $addTime,
                'add_time' => time()
            ], 'key');
        } else {
            return $this->dao->save([
                'key' => $key,
                'result' => json_encode($result),
                'expire_time' => $addTime,
                'add_time' => time()
            ]);
        }
    }
    
    /**
     * 注释：删除某个缓存
     * 创建人：Jack
     * 创建时间：2024/1/13 8:49
     * @param string $key
     * @return bool
     */
    public function delectDbCache(string $key = '')
    {
        if ($key) {
            return $this->dao->delete($key, 'key');
        }
        return false;
    }

}
